#ifndef _TAIIC_KEY_H_
#define _TAIIC_KEY_H_

#include "stft.h"
#include "rk_debug.h"
#include "rk_defines.h"
#include <string>
#include <thread>
#include <atomic>

/*
 *  如何确认键盘在"/dev/input/event"几号?
 *  通过"cat /proc/bus/input/devices"可以看到"keyboard"所在的event号
 */
// #define INPUT_DEV_PATH "/dev/input/event1"
// #define VOC_UP 116
#define VOC_DOWN 115
#define POWER_DOWN 116

#define SYSFS_GPIO_MODE "/sys/class/switch/mode-gpio/state"                        // 常规模式切换键
#define SYSFS_GPIO_MODE1 "/sys/class/switch/mode1-gpio/state"                      // 特殊模式切换键
// #define SYSFS_GPIO_AUDIO "/sys/class/switch/audio-det-gpio/state"                  // 全包·耳机 no音频线检测
#define SYSFS_GPIO_AUDIO "/sys/class/switch/ptt-gpio/state"                  // 音频线检测 alway=0
#define SYSFS_GPIO_PTT "/sys/class/switch/ptt-gpio/state"                          // ptt键
#define SYSFS_BATTERY_CAP "/sys/class/power_supply/cw2017-battery/capacity"        // 电量查询
#define SYSFS_BATTERY_VOLTAGE "/sys/class/power_supply/cw2017-battery/voltage_now" // 电池电压

#define SYSFS_DEVICE_PTT "/dev/input/event0" // 全包·耳机的ptt设备

// #define SYSFS_POWER_UP "/dev/input/event1"   // 长按开机键
#define SYSFS_POWER_DOWN "/dev/input/event1" // 长按关机键

#define HOLD_TIME 200


typedef struct _rkBatteryQuery
{
    int init_cap; // 初始电量
    int init_vol; // 初始电压

    int last_cap;
    int compCap;
    int count = 0;
    int charge_state = 0;
    // string bat_lable;
} TEST_BATTERY_QUERY; // 电量查询相关结构体

typedef enum taiicKEY_NAME
{
    TAIIC_MODE = 0,  // 常规模式切换键
    TAIIC_AUDIO = 1, // 音频线检测
    TAIIC_PTT = 2,   // ptt键检测
    TAIIC_MODE1 = 3, //  特殊模式切换键
    // TAIIC_POWER = 3,  // 电源键，暂时不用，这个为event事件

} TAIIC_KEY_NAME;

typedef enum taiicMODEL_RUN
{
    MODEL_RUN = 0,  // 模型run
    MODEL_STOP = 1, // 模型stop

} TEST_MODEL_RUN;

typedef enum taiicPTT_STATE
{
    PTT_DOWN = 0,
    PTT_UP = 1,
} TEST_PTT_STATE;

typedef struct _rkModeCtx
{
    int mode_flag;  // 常规模式
    int audio_flag; // audio
    int ptt_flag;   // ptt
    int mode1_flag; // 特殊模式
} TAIIC_MODE_STATE_CTX_S;

typedef enum taiicMODE_STATE
{
    MODE_DOWN = 0,
    MODE_UP = 1, // 释放状态
} TEST_MODE_STATE;

typedef enum taiicAUDIO_STATE
{
    AUDIO_CONN = 0,
    AUDIO_NO_CONN = 1,

} TEST_AUDIO_STATE;

typedef enum taiicKEY_STATE
{
    TAIIC_KEY_UP = 0,   // 抬起
    TAIIC_KEY_DOWN = 1, // 按下
    TAIIC_KEY_HOLD = 2, // 长按

    TAIIC_KEY_NOVALUE = 99, // 无效

} TAIIC_KEY_STATE;

typedef enum taiicReceiveKey_State
{
    WOBA_KEY_DOWN = 0,      // 握把按下
    WOBA_KEY_UP = 1,        // 握把抬起
    CONNECT_IIIS = 2,       // 连接IIIS
    BATTERY_START_SEND = 3, // 发送初始电量
} TAIIC_RECEIVE_KEY_STATE;

// ai 数据回调
typedef void(tKeyValueCallback)(TAIIC_KEY_STATE old_value, TAIIC_KEY_NAME key_name, TAIIC_KEY_STATE key_value);
// 电量数据回调
typedef void(tPowerValueCallback)(int power_cap, long power_vol);

/*
 *  按键回调注册
 *  参数:
 *      obj: 用户私有指针,会在互调的时候传回给用户
 *      callback: 回调函数原型 void callback(void *obj, int key, int type)
 *  回调函数参数:
 *      obj: 前面传入的用户私有指针
 *      key: 键位,可以看头文件<linux/input.h>中的定义,或者先测试打印一遍就知道哪个按键对哪个值了
 *      type: 按键状态,0/松开时,1/按下时,2/一直按住(会反复触发回调,间隔多久我也忘了)
 *  返回: 0/成功 -1/失败,找不到设备或者没有sudo运行
 */

void throwOut_thread(void *obj, void *(*callback)(void *));
int taiic_key_register(TAIIC_KEY_STATE *state, void (*callback)(TAIIC_KEY_STATE, TAIIC_KEY_NAME, TAIIC_KEY_STATE));

// 读取键值
TAIIC_KEY_STATE taiic_gpio_read(int key_name);
// 注册所有按键
int taiic_all_key_registers(TAIIC_MODE_STATE_CTX_S *ctx, tKeyValueCallback keyCallback);
// 监听全包·耳机的ptt
void keyboard_event_listener(const char *device_path, tKeyValueCallback callback);

// int power_registers(TEST_BATTERY_QUERY batData, tPowerValueCallback powerCallback);
int taiic_batt_power_registers(tPowerValueCallback powerCallback);

// add by mtd at 2024/05/10
void ExecCmd(char *in, char out[]);
char *concatenate(const char *str1, const char *str2);

#endif
